// 导入数据库模块 用于接口处理函数对数据库进行操作
const db = require('../db/index')

//安装加密包并导入 npm i bcryptjs@2.4.3
const bcrypt = require('bcryptjs')
// 调用bcrypt.hashSync(明文密码，随机盐的长度)方法，对用户的密码进行加密处理
// 调用 bcrypt.compareSync(用户提交的密码, 数据库中的密码) 方法比较密码是否一致 返回值是布尔值（true 一致、false 不一致）

//导入生成token的包  npm i jsonwebtoken@8.5.1
const jwt = require('jsonwebtoken')
// 导入全局配置文件 里面有加密解密token的密钥 config.jwtSecretKey
const config = require('../config.js')

// 注册用户处理函数
exports.regUser = (req, res) => {
    // 获取客户端提交到服务器的用户信息
    const userinfo = req.body

    // if (!userinfo.username || !userinfo.password) {// 判断用户名或密码是否为空
    //     // return res.send({
    //     //     status: 1,// 1表示失败状态
    //     //     message: '用户名或者密码不合法'
    //     // })
    //     return res.cc('用户名或者密码不合法')
    // }

    // 定义sql语句，查询用户名是否被占用
    const sqlStr = 'select * from ev_users where username = ?'
    db.query(sqlStr, userinfo.username, (err, results) => {
        if (err) {// 判断查询是否出错
            // return res.send({
            //     status: 1,
            //     message: err.message
            // })
            return res.cc(err)
        }

        if (results.length > 0) {// 判断查询用户是否重名
            // return res.send({
            //     status: 1,
            //     message: '用户名已存在'
            // })
            return res.cc('用户名已存在')
        }

        // 用户名没有重复，向数据库插入数据，并对密码进行加密
        userinfo.password = bcrypt.hashSync(userinfo.password, 10)

        // 定义sql语句,向数据库插入新用户
        const insertSql = 'insert into ev_users set ?'
        db.query(insertSql, { username: userinfo.username, password: userinfo.password }, (err, results) => {
            if (err) {
                // return res.send({
                //     status: 1,
                //     message: err.message
                // })
                return res.cc(err)
            }
            if (results.affectedRows !== 1) {// 判断影响行数是否为1
                // return res.send({
                //     status: 1,
                //     message: '注册失败'
                // })
                return res.cc('注册失败')
            }
            // return res.send({
            //     status: 0,
            //     message: '注册成功'
            // })
            return res.cc('注册成功', 0)
        })


    })

}
// 登陆处理函数
exports.login = (req, res) => {

    // 接收数据
    const userinfo = req.body

    // 定义SQL语句 查询用户信息
    const strSql = 'select * from ev_users where username=?'
    db.query(strSql, userinfo.username, (err, results) => {

        if (err) { return res.cc(err) }// 数据库查询错误
        if (results.length !== 1) { return res.cc('登陆失败') }// 没有查询到数据


        // 判断密码是否正确
        // 拿着用户输入的密码,和数据库中存储的密码进行对比
        const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
        if (!compareResult) { return res.cc('登陆失败') }

        // 生成token

        // 定义要生成token的用户信息 user
        //   通过 ES6 的高级语法，快速剔除 密码 和 头像 的值
        // 剔除完毕之后，user 中只保留了用户的 id, username, nickname, email 这四个属性的值
        const user = { ...results[0], password: '', user_pic: '' }

        // 安装生成 Token 字符串的包,并对用户信息加密生成token字符串
        const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: '10h' })

        return res.send({
            status: 0,
            message: '登陆成功',
            data: {},
            token: 'Bearer ' + tokenStr

        })

    })
}